package com.coolgor.coldot.config.dao;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.beans.PropertyVetoException;

@Configuration
//配置Mybatis mapper的扫描路径
@MapperScan("com.coolgor.coldot.dao")
public class DataSourceConfiguration {
    @Value("${jdbc.driver}")
    private String jdbcDriver;
    @Value("${jdbc.url}")
    private String jdbcUrl;
    @Value("${jdbc.username}")
    private String jdbcUser;
    @Value("${jdbc.password}")
    private String jdbcPassword;
    // 配置C3P0数据库链接池
    @Value("${jdbc.minPoolSize}")
    private int minPoolSize;
    @Value("${jdbc.maxPoolSize}")
    private int maxPoolSize;
    @Value("${jdbc.autoCommitOnClose}")
    private boolean autoCommitOnClose;
    @Value("${jdbc.checkoutTimeout}")
    private int checkoutTimeout;
    @Value("${jdbc.acquireRetryAttempts}")
    private int acquireRetryAttempts;
    // 下面两个参数是配置C3P0是否进行主动测试持有链接的有效性
    @Value("${jdbc.testConnectionOnCheckout}")
    private boolean testConnectionOnCheckout;
    //false为不测试，true为主动测试，主动测试会消耗大量资源，慎用
    @Value("${jdbc.testConnectionOnCheckin}")
    private boolean testConnectionOnCheckin;
    //设置自动测试连接的周期，单位为秒
    @Value("${jdbc.idleConnectionTestPeriod}")
    private int idleConnectionTestPeriod;

    @Bean(name="dataSource")
    public ComboPooledDataSource createDataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //配置数据库连接信息
        dataSource.setDriverClass(jdbcDriver);
        dataSource.setJdbcUrl(jdbcUrl);
        dataSource.setUser(jdbcUser);
        dataSource.setPassword(jdbcPassword);
        //配置C3P0连接池的私有属性
        dataSource.setInitialPoolSize(minPoolSize);//设置init
        dataSource.setMinPoolSize(minPoolSize);//最小连接数
        dataSource.setMaxPoolSize(maxPoolSize);//最大连接数
        dataSource.setAutoCommitOnClose(autoCommitOnClose);//关闭连接后，不自动提交事务处理。
        dataSource.setCheckoutTimeout(checkoutTimeout*1000);// 获取连接超时时间(该属性单位为毫秒，但配置文件单位秒，所以这里要乘1000)
        dataSource.setAcquireRetryAttempts(acquireRetryAttempts);//获取连接失败重试次数
        //下面两个参数是配置C3P0是否进行主动测试持有链接的有效性
        dataSource.setTestConnectionOnCheckout(testConnectionOnCheckout);
        //false为不测试，true为主动测试，主动测试会消耗大量资源，慎用
        dataSource.setTestConnectionOnCheckin(testConnectionOnCheckin);
        //设置自动测试连接的周期，单位为秒
        dataSource.setIdleConnectionTestPeriod(idleConnectionTestPeriod);
        return dataSource;
    }
}
